{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notes:\n",
    " * with improved individual views at higher resolution, transit mask\n",
    " * model seems to start learning S\n",
    " * transit mask doesn't help correct for wrong period...\n",
    " * trying to compress the input space a little, drop seemingly redundant features\n",
    " * set pooling/kernel sizes to symmetric sizes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['/mnt/tess/astronet/checkpoints/extended_20_run_10/1/AstroCNNModel_extended_20201207_033816',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/2/AstroCNNModel_extended_20201207_040519',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/3/AstroCNNModel_extended_20201207_043225',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/4/AstroCNNModel_extended_20201207_045927',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/5/AstroCNNModel_extended_20201207_052632',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/6/AstroCNNModel_extended_20201207_055338',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/7/AstroCNNModel_extended_20201207_062102',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/8/AstroCNNModel_extended_20201207_064804',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/9/AstroCNNModel_extended_20201207_071515',\n",
       " '/mnt/tess/astronet/checkpoints/extended_20_run_10/10/AstroCNNModel_extended_20201207_074218']"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "chkpt_root = '/mnt/tess/astronet/checkpoints/extended_20_run_10'\n",
    "data_files = '/mnt/tess/astronet/tfrecords-20-val/*'\n",
    "tces_file = '/mnt/tess/astronet/tces-v4-val.csv'\n",
    "\n",
    "nruns = 10\n",
    "\n",
    "def load_ensemble(chkpt_root, nruns):\n",
    "    checkpts = []\n",
    "    for i in range(nruns):\n",
    "        parent = os.path.join(chkpt_root, str(i + 1))\n",
    "        if not os.path.exists(parent):\n",
    "            break\n",
    "        all_dirs = os.listdir(parent)\n",
    "        if not all_dirs:\n",
    "            break\n",
    "        d, = all_dirs\n",
    "        checkpts.append(os.path.join(parent, d))\n",
    "    return checkpts\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running model 1\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 2\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 3\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 4\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 5\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 6\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 7\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 8\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 9\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n",
      "Running model 10\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "1558 records\n"
     ]
    }
   ],
   "source": [
    "import getpass\n",
    "import os\n",
    "from astronet import predict\n",
    "import tensorflow as tf\n",
    "\n",
    "\n",
    "def run_predictions(path):\n",
    "    predict.FLAGS = predict.parser.parse_args([\n",
    "      '--model_dir', path,\n",
    "      '--data_files', data_files,\n",
    "      '--output_file', '',\n",
    "    ])\n",
    "\n",
    "    return predict.predict()\n",
    "\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "ensemble_preds = []\n",
    "config = None\n",
    "for i, path in enumerate(paths):\n",
    "    print(f'Running model {i + 1}')\n",
    "    preds, config = run_predictions(path)\n",
    "    ensemble_preds.append(preds.set_index('tic_id'))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "agg_preds = {}\n",
    "\n",
    "for preds in ensemble_preds:\n",
    "    for tic_id in preds.index:\n",
    "        if tic_id not in agg_preds:\n",
    "            agg_preds[tic_id] = []\n",
    "\n",
    "        row = preds[preds.index == tic_id]\n",
    "        pred_v = row.values[0]\n",
    "        if len(row.values) > 1:\n",
    "            print(f'Warning: duplicate predictions for {tic_id}')\n",
    "        if pred_v[0] >= config.hparams.prediction_threshold:\n",
    "            agg_preds[tic_id].append('disp_E')\n",
    "        else:\n",
    "            agg_preds[tic_id].append(preds.columns[np.argmax(pred_v)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "labels = ['disp_E', 'disp_N', 'disp_J', 'disp_S', 'disp_B']\n",
    "\n",
    "final_preds = []\n",
    "for tic_id in list(agg_preds.keys()):\n",
    "    counts = {l: 0 for l in labels}\n",
    "    for e in agg_preds[tic_id]:\n",
    "        counts[e] += 1\n",
    "    maxcount = max(counts.values())\n",
    "    counts.update({\n",
    "        'tic_id': tic_id,\n",
    "        'maxcount': maxcount,\n",
    "    })\n",
    "    final_preds.append(counts)\n",
    "    \n",
    "final_preds = pd.DataFrame(final_preds).set_index('tic_id')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "tce_table = pd.read_csv(tces_file, header=0).set_index('tic_id')\n",
    "tce_labels = tce_table[labels]\n",
    "\n",
    "pl = final_preds.join(tce_labels, on='tic_id', how='left', lsuffix='_p')\n",
    "\n",
    "pl.head()\n",
    "pd.set_option('display.max_columns', None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall: 0.9619565217391305\n",
      "Precision: 0.7662337662337663\n"
     ]
    }
   ],
   "source": [
    "ppos = (pl['disp_E_p'] > 0)\n",
    "pos = (pl['disp_E'] > 0)\n",
    "\n",
    "pneg = (pl['disp_E_p'] == 0)\n",
    "neg = (pl['disp_E'] == 0)\n",
    "\n",
    "print('Recall:', len(pl[ppos & pos]) / len(pl[pos]))\n",
    "print('Precision:', len(pl[ppos & pos]) / len(pl[ppos]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "118412801\n",
      "158159741\n",
      "276978548\n",
      "365242787\n",
      "384065528\n",
      "404220255\n",
      "104485403\n"
     ]
    }
   ],
   "source": [
    "for i in pl[pos & pneg][[]].join(tce_table, on='tic_id', how='left').index:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>disp_E</th>\n",
       "      <th>disp_N</th>\n",
       "      <th>disp_J</th>\n",
       "      <th>disp_S</th>\n",
       "      <th>disp_B</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tic_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.007111</td>\n",
       "      <td>0.188153</td>\n",
       "      <td>0.976409</td>\n",
       "      <td>0.028848</td>\n",
       "      <td>0.040342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.008395</td>\n",
       "      <td>0.166625</td>\n",
       "      <td>0.962108</td>\n",
       "      <td>0.023214</td>\n",
       "      <td>0.197663</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.005188</td>\n",
       "      <td>0.260546</td>\n",
       "      <td>0.982348</td>\n",
       "      <td>0.010251</td>\n",
       "      <td>0.085250</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.016916</td>\n",
       "      <td>0.294118</td>\n",
       "      <td>0.966275</td>\n",
       "      <td>0.014172</td>\n",
       "      <td>0.053991</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.081899</td>\n",
       "      <td>0.231226</td>\n",
       "      <td>0.756709</td>\n",
       "      <td>0.045495</td>\n",
       "      <td>0.139051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.007788</td>\n",
       "      <td>0.233464</td>\n",
       "      <td>0.978604</td>\n",
       "      <td>0.013547</td>\n",
       "      <td>0.061004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.044723</td>\n",
       "      <td>0.251473</td>\n",
       "      <td>0.924749</td>\n",
       "      <td>0.014753</td>\n",
       "      <td>0.041669</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.097381</td>\n",
       "      <td>0.211392</td>\n",
       "      <td>0.688043</td>\n",
       "      <td>0.028304</td>\n",
       "      <td>0.116629</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.013009</td>\n",
       "      <td>0.219152</td>\n",
       "      <td>0.964518</td>\n",
       "      <td>0.041732</td>\n",
       "      <td>0.103184</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158159741</th>\n",
       "      <td>0.016506</td>\n",
       "      <td>0.195065</td>\n",
       "      <td>0.952726</td>\n",
       "      <td>0.025537</td>\n",
       "      <td>0.303755</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             disp_E    disp_N    disp_J    disp_S    disp_B\n",
       "tic_id                                                     \n",
       "158159741  0.007111  0.188153  0.976409  0.028848  0.040342\n",
       "158159741  0.008395  0.166625  0.962108  0.023214  0.197663\n",
       "158159741  0.005188  0.260546  0.982348  0.010251  0.085250\n",
       "158159741  0.016916  0.294118  0.966275  0.014172  0.053991\n",
       "158159741  0.081899  0.231226  0.756709  0.045495  0.139051\n",
       "158159741  0.007788  0.233464  0.978604  0.013547  0.061004\n",
       "158159741  0.044723  0.251473  0.924749  0.014753  0.041669\n",
       "158159741  0.097381  0.211392  0.688043  0.028304  0.116629\n",
       "158159741  0.013009  0.219152  0.964518  0.041732  0.103184\n",
       "158159741  0.016506  0.195065  0.952726  0.025537  0.303755"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def compare(ensemble_preds, filter):\n",
    "    result = ensemble_preds[0][filter]\n",
    "    for preds in ensemble_preds[1:]:\n",
    "        result = result.append(preds[filter])\n",
    "    return result\n",
    "\n",
    "compare(ensemble_preds, preds.index == 158159741)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>disp_E_p</th>\n",
       "      <th>disp_N_p</th>\n",
       "      <th>disp_J_p</th>\n",
       "      <th>disp_S_p</th>\n",
       "      <th>disp_B_p</th>\n",
       "      <th>maxcount</th>\n",
       "      <th>disp_E</th>\n",
       "      <th>disp_N</th>\n",
       "      <th>disp_J</th>\n",
       "      <th>disp_S</th>\n",
       "      <th>disp_B</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tic_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [disp_E_p, disp_N_p, disp_J_p, disp_S_p, disp_B_p, maxcount, disp_E, disp_N, disp_J, disp_S, disp_B]\n",
       "Index: []"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pl[pl.index == 114053589]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PR curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10, 1558)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tics = set(ensemble_preds[0].index.values)\n",
    "\n",
    "tic_index = {v: i for i, v in enumerate(tics)}\n",
    "\n",
    "pred_es = np.zeros([len(ensemble_preds), len(tic_index)])\n",
    "for i, preds in enumerate(ensemble_preds):\n",
    "    for row in preds.iterrows():\n",
    "        tic, pred_e = row[0], row[1][0]\n",
    "        pred_es[i][tic_index[tic]] = pred_e\n",
    "        \n",
    "pred_es.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "lbl_es = np.zeros([len(tic_index)], dtype=np.bool)\n",
    "for row in tce_labels.iterrows():\n",
    "    tic, lbl_e = row[0], row[1]['disp_E']\n",
    "    if tic in tic_index:\n",
    "        lbl_es[tic_index[tic]] = (lbl_e > 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_cond_pos = float(np.sum(lbl_es))\n",
    "\n",
    "def pr_at_th(th):\n",
    "    pred_pos = np.any(pred_es >= th, axis=0)\n",
    "    true_pos = pred_pos & lbl_es\n",
    "    num_pred_pos = float(np.sum(pred_pos))\n",
    "    num_true_pos = float(np.sum(true_pos))\n",
    "    if num_pred_pos == 0:\n",
    "        return 1.0, 0.0\n",
    "    return float(num_true_pos) / float(num_pred_pos), float(num_true_pos) / float(num_cond_pos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC: 0.9691075327845724, max R: 0.9945652173913043, max P: 1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1200x740 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "ps, rs = ([], [])\n",
    "th = np.max(pred_es)\n",
    "while th >= 0.0:\n",
    "    p, r = pr_at_th(th)\n",
    "    if p > 0:\n",
    "        ps.append(p)\n",
    "        rs.append(r)\n",
    "    else:\n",
    "        ps.append(1.0)\n",
    "        rs.append(0.0)\n",
    "    th -= 0.0005\n",
    "    \n",
    "from sklearn import metrics\n",
    "\n",
    "print(f'AUC: {metrics.auc(rs, ps)}, max R: {max(rs)}, max P: {max(ps)}')\n",
    "    \n",
    "fig, ax = plt.subplots(figsize=(6, 3.7), dpi=200)\n",
    "\n",
    "ax.spines['top'].set_color('#808080')\n",
    "ax.spines['right'].set_color('#808080')\n",
    "ax.spines['left'].set_color('#808080')\n",
    "ax.spines['bottom'].set_color('#808080')\n",
    "ax.tick_params(direction='in', color='#808080')\n",
    "\n",
    "plt.grid(color='#c0c0c0', linestyle='--', linewidth=0.5)\n",
    "\n",
    "plt.ylabel('Precision', fontweight='bold')\n",
    "plt.xlabel('Recall', fontweight='bold')\n",
    "\n",
    "plt.xlim((0.0, 1.0))\n",
    "plt.ylim((0.0, 1.0))\n",
    "\n",
    "_ = plt.plot(rs, ps)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
